package com.huyun.web.modules.maptest;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 实现hashmap 存储链表
 * @author huyunqiang
 * @Date 2019/9/28 19:58
 */
@RestController
@RequestMapping("/map/")
public class LinkHashMap {

    public static HashMap<String,Map<String,ArrayList<String>>> mapHashMap = new HashMap<>();

    //十六进制初始化hashMap
    @PostConstruct
    static void initMap() {
        String[] arr = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                String s = arr[i] + arr[j];
                mapHashMap.put(s, LinkHashMap.newJudgeHashMap());
            }
        }
    }

    //初始化ConcurrentHashMap
    static ConcurrentHashMap<String,ArrayList<String>> newJudgeHashMap(){
        ConcurrentHashMap<String,ArrayList<String>> concurrentHashMap = new ConcurrentHashMap<>();
        return  concurrentHashMap;
    }

    /**
     * 将最新的数据加到链表末尾
     * @param map  内存中数据集合
     * @param date  获取到的新数据
     * @param s
     */
    private void pushFrontAndMaintain(Map<String,ArrayList<String>> map,String date, String md5,Integer s){
        //判断内存中的新数据是否存在
        Optional<ArrayList<String>> list = Optional.ofNullable(map.get("123"));
        if(list.isPresent()){
            //如果内存中的数据存在就进行一些数据处理
            boolean b = pushDateTain(map.get("123"),date,s);

        }else {
            //内存中数据不存在直接加入链表中
            ArrayList<String> datelist = new ArrayList<>();
            datelist.add(date);
            map.put("123",datelist);

        }
    }

    /**
     * 对数据进行验证
     * @param dateList 之前内存中的数据集合
     * @param date   要处理的新数据
     * @param s
     * @return
     */
    private boolean pushDateTain(ArrayList<String> dateList, String date, Integer s) {
        //获取原来内存中的数据
        int size = dateList.size();
        if(size > 0){
            //可以通过时间戳来判断数据是否合法

        }
        //将新数据添加到链表
        dateList.add(date);
        size ++;
        //内存中只保存最近的10 条数据
        if(size <s){
            return true;
        }

        int del = size - s;

        //删除历史数据 只保留后面的数据
        dateList.subList(0, del).clear();

        return true;
    }
//    @GetMapping("send")
//    public void mapTest() {
//        for (int i=0;i<100;i++){
//            String md5 = MD5Utils.encrypt("192.100");
//            String substring = md5.substring(0, 2);
//            Map<String, ArrayList<String>> listMap = mapHashMap.get(substring);
//            pushFrontAndMaintain(listMap,i+"ssss",substring,5);
//        }
//    }

}
